package jp.co.katagaki.crossword.puzzle;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

import au.com.bytecode.opencsv.CSVReader;

/**
 * 単語を表すクラス。
 *
 * @author naotake
 */
public class Word {

    /** 単語 */
    private String word;
    /** ジャンル */
    private Genre genre;
    /** ヒント */
    private String hint;

    /**
     * 単語を取得する。
     *
     * @return 単語
     */
    public String getWord() {
        return word;
    }

    /**
     * 単語を設定する。
     *
     * @param word
     *            単語
     */
    public void setWord(String word) {
        this.word = word;
    }

    /**
     * ジャンルを取得する。
     *
     * @return ジャンル
     */
    public Genre getGenre() {
        return genre;
    }

    /**
     * ジャンルを設定する。
     *
     * @param genre
     *            ジャンル
     */
    public void setGenre(Genre genre) {
        this.genre = genre;
    }

    /**
     * ジャンルを表す文字列表現から{@link Genre}を解決し設定する。<br />
     * 本メソッドは{@link CSVReader}によって呼び出されることを想定しているが、 {@link CSVReader}側の制約により可視性が
     * public となっている。
     *
     * @param genreLabel
     *            ジャンルを表す文字列表現
     */
    public void setResolveGenre(String genreLabel) {
        setGenre(Genre.fromString(genreLabel));
    }

    /**
     * ヒントを取得する。
     *
     * @return ヒント
     */
    public String getHint() {
        return hint;
    }

    /**
     * ヒントを設定する。
     *
     * @param hint
     *            ヒント
     */
    public void setHint(String hint) {
        this.hint = hint;
    }

    /**
     * この単語が指定された正規表現と一致するかどうかを判定する。
     *
     * @param regex
     *            判定する正規表現
     * @return 一致する場合は true
     */
    public boolean matches(String regex) {
        return word.matches(regex);
    }

    @Override
    public boolean equals(Object other) {
        return EqualsBuilder.reflectionEquals(this, other);
    }

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }
}
